package com.zhao.oss.seivice.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.zhao.oss.seivice.OssService;
import com.zhao.oss.util.RedadyProperties;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

@Service
public class OssServiceImpl implements OssService {
    @Override
    public String upload(MultipartFile file) {
        //通过工具类获取阿里云存储的常量
        String endpoint = RedadyProperties.END_POINT;
        String accessKeyId = RedadyProperties.ACCESS_KEY_ID;
        String accessKeySecret = RedadyProperties.ACCESS_KEY_SECRET;
        String bucketName = RedadyProperties.BUCKET_NAME;

        try {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            InputStream inputStream = file.getInputStream();
            //获取文件名称
            String filename = file.getOriginalFilename();
            /**
             *                           再使用同一个文件名称时，后面的文件会覆盖前面的文件
             *    可以采用的解决方法：
             *       1、使用一个随机值，把随机值和文件名称拼接起来
             *       2、把文件按日期分类
             */

            //使用一个随机值，把随机值和文件名称拼接起来
            //因为生产的uuid会带有 “-” ，可以使用replaceAll替换，用后面的替换前面的
            String uuid = UUID.randomUUID().toString().replaceAll("-","");
            filename=uuid+filename;

            //获取当前日期，有工具类(在pom文件中引入) 2020/02/02
            String datePath = new DateTime().toString("yyyy/MM/dd");
            //此时的日期会变成 2020/02/02/sdsfds0.jpg
            filename=datePath+"/"+filename;

            // putObjectputObject中第一个参数：bucketName名称
            // putObjectputObject中第二个参数：上传oss文件路径和文件名称
            // putObjectputObject中第三个参数：输入流
            ossClient.putObject(bucketName, filename, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();

            //返回值
            String url="https://" + bucketName + "." + endpoint + "/" + filename;
            return url;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}
